home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / actionrp / lrogue0.1 / lrogue0 / rogue / inventory.c < prev    next >
C/C++ Source or Header  |  1992-09-28  |  9KB  |  463 lines

  1. /*
  2.  * inventory.c
  3.  *
  4.  * This source herein may be modified and/or distributed by anybody who
  5.  * so desires, with the following restrictions:
  6.  *    1.)  No portion of this notice shall be removed.
  7.  *    2.)  Credit shall not be taken for the creation of this source.
  8.  *    3.)  This code is not to be traded, sold, or used for personal
  9.  *         gain or profit.
  10.  *
  11.  */
  12.  
  13. #ifndef CURSES
  14. #include <curses.h>
  15. #endif CURSES
  16. #include "rogue.h"
  17.  
  18. #define swap_string(x,y) {t = x; x = y; y = t;}
  19.  
  20. boolean is_wood[WANDS];
  21.  
  22. char *wand_materials[WAND_MATERIALS] = {
  23.     "steel ",
  24.     "bronze ",
  25.     "gold ",
  26.     "silver ",
  27.     "copper ",
  28.     "nickel ",
  29.     "cobalt ",
  30.     "tin ",
  31.     "iron ",
  32.     "magnesium ",
  33.     "chrome ",
  34.     "carbon ",
  35.     "platinum ",
  36.     "silicon ",
  37.     "titanium ",
  38.  
  39.     "teak ",
  40.     "oak ",
  41.     "cherry ",
  42.     "birch ",
  43.     "pine ",
  44.     "cedar ",
  45.     "redwood ",
  46.     "balsa ",
  47.     "ivory ",
  48.     "walnut ",
  49.     "maple ",
  50.     "mahogany ",
  51.     "elm ",
  52.     "palm ",
  53.     "wooden "
  54. };
  55.  
  56. char *gems[GEMS] = {
  57.     "diamond ",
  58.     "stibotantalite ",
  59.     "lapi-lazuli ",
  60.     "ruby ",
  61.     "emerald ",
  62.     "sapphire ",
  63.     "amethyst ",
  64.     "quartz ",
  65.     "tiger-eye ",
  66.     "opal ",
  67.     "agate ",
  68.     "turquoise ",
  69.     "pearl ",
  70.     "garnet "
  71. };
  72.  
  73. char *syllables[MAXSYLLABLES] = {
  74.     "blech ",
  75.     "foo ",
  76.     "barf ",
  77.     "rech ",
  78.     "bar ",
  79.     "blech ",
  80.     "quo ",
  81.     "bloto ",
  82.     "woh ",
  83.     "caca ",
  84.     "blorp ",
  85.     "erp ",
  86.     "festr ",
  87.     "rot ",
  88.     "slie ",
  89.     "snorf ",
  90.     "iky ",
  91.     "yuky ",
  92.     "ooze ",
  93.     "ah ",
  94.     "bahl ",
  95.     "zep ",
  96.     "druhl ",
  97.     "flem ",
  98.     "behil ",
  99.     "arek ",
  100.     "mep ",
  101.     "zihr ",
  102.     "grit ",
  103.     "kona ",
  104.     "kini ",
  105.     "ichi ",
  106.     "niah ",
  107.     "ogr ",
  108.     "ooh ",
  109.     "ighr ",
  110.     "coph ",
  111.     "swerr ",
  112.     "mihln ",
  113.     "poxi "
  114. };
  115.  
  116. extern boolean wizard;
  117.  
  118. inventory(pack, mask)
  119. object *pack;
  120. unsigned short mask;
  121. {
  122.     object *obj;
  123.     short i = 0, j, maxlen = 0, n;
  124.     char descs[MAX_PACK_COUNT+1][DCOLS];
  125.     short row, col;
  126.  
  127.     obj = pack->next_object;
  128.  
  129.     if (!obj) {
  130.         message("your pack is empty", 0);
  131.         return;
  132.     }
  133.     while (obj) {
  134.         if (obj->what_is & mask) {
  135.             descs[i][0] = ' ';
  136.             descs[i][1] = obj->ichar;
  137.             descs[i][2] = ((obj->what_is & ARMOR) && obj->is_protected)
  138.                 ? '}' : ')';
  139.             descs[i][3] = ' ';
  140.             get_desc(obj, descs[i]+4);
  141.             if ((n = strlen(descs[i])) > maxlen) {
  142.                 maxlen = n;
  143.             }
  144.         i++;
  145.         }
  146.         obj = obj->next_object;
  147.     }
  148.     (void) strcpy(descs[i++], " --press space to continue--");
  149.     if (maxlen < 27) maxlen = 27;
  150.     col = DCOLS - (maxlen + 2);
  151.  
  152.     for (row = 0; ((row < i) && (row < DROWS)); row++) {
  153.         if (row > 0) {
  154.             for (j = col; j < DCOLS; j++) {
  155.                 descs[row-1][j-col] = mvinch(row, j);
  156.             }
  157.             descs[row-1][j-col] = 0;
  158.         }
  159.         mvaddstr(row, col, descs[row]);
  160.         clrtoeol();
  161.     }
  162.     refresh();
  163.     wait_for_ack();
  164.  
  165.     move(0, 0);
  166.     clrtoeol();
  167.  
  168.     for (j = 1; ((j < i)&&(j< DROWS)); j++) {
  169.         mvaddstr(j, col, descs[j-1]);
  170.     }
  171. }
  172.  
  173. mix_colors()
  174. {
  175.     short i, j, k;
  176.     char *t;
  177.  
  178.     for (i = 0; i <= 32; i++) {
  179.         j = get_rand(0, (POTIONS - 1));
  180.         k = get_rand(0, (POTIONS - 1));
  181.         swap_string(id_potions[j].title, id_potions[k].title);
  182.     }
  183. }
  184.  
  185. make_scroll_titles()
  186. {
  187.     short i, j, n;
  188.     short sylls, s;
  189.  
  190.     for (i = 0; i < SCROLLS; i++) {
  191.         sylls = get_rand(2, 5);
  192.         id_scrolls[i].title=(char *)malloc(128);
  193.         if(id_scrolls[i].title==(char *)0)
  194.             clean_up("Panic: no memory.",0);
  195.         (void) strcpy(id_scrolls[i].title, "'");
  196.  
  197.         for (j = 0; j < sylls; j++) {
  198.             s = get_rand(1, (MAXSYLLABLES-1));
  199.             (void) strcat(id_scrolls[i].title, syllables[s]);
  200.         }
  201.         n = strlen(id_scrolls[i].title);
  202.         (void) strcpy(id_scrolls[i].title+(n-1), "' ");
  203.     }
  204. }
  205.  
  206. get_desc(obj, desc)
  207. object *obj;
  208. char *desc;
  209. {
  210.     char *item_name;
  211.     struct id *id_table;
  212.     char more_info[32];
  213.     short i;
  214.  
  215.     if (obj->what_is == AMULET) {
  216.         (void) strcpy(desc, "the amulet of Yendor ");
  217.         return;
  218.     }
  219.     item_name = name_of(obj);
  220.  
  221.     if (obj->what_is == GOLD) {
  222.         sprintf(desc, "%d pieces of gold", obj->quantity);
  223.         return;
  224.     }
  225.  
  226.     if (obj->what_is != ARMOR) {
  227.         if (obj->quantity == 1) {
  228.             (void) strcpy(desc, "a ");
  229.         } else {
  230.             sprintf(desc, "%d ", obj->quantity);
  231.         }
  232.     }
  233.     if (obj->what_is == FOOD) {
  234.         if (obj->which_kind == RATION) {
  235.             if (obj->quantity > 1) {
  236.                 sprintf(desc, "%d rations of ", obj->quantity);
  237.             } else {
  238.                 (void) strcpy(desc, "some ");
  239.             }
  240.         } else {
  241.             (void) strcpy(desc, "a ");
  242.         }
  243.         (void) strcat(desc, item_name);
  244.         goto ANA;
  245.     }
  246.     id_table = get_id_table(obj);
  247.  
  248.     if (wizard) {
  249.         goto ID;
  250.     }
  251.     if (obj->what_is & (WEAPON | ARMOR | WAND | RING)) {
  252.         goto CHECK;
  253.     }
  254.  
  255.     switch(id_table[obj->which_kind].id_status) {
  256.     case UNIDENTIFIED:
  257. CHECK:
  258.         switch(obj->what_is) {
  259.         case SCROLL:
  260.             (void) strcat(desc, item_name);
  261.             (void) strcat(desc, "entitled: ");
  262.             (void) strcat(desc, id_table[obj->which_kind].title);
  263.             break;
  264.         case POTION:
  265.             (void) strcat(desc, id_table[obj->which_kind].title);
  266.             (void) strcat(desc, item_name);
  267.             break;
  268.         case WAND:
  269.         case RING:
  270.             if (obj->identified ||
  271.             (id_table[obj->which_kind].id_status == IDENTIFIED)) {
  272.                 goto ID;
  273.             }
  274.             if (id_table[obj->which_kind].id_status == CALLED) {
  275.                 goto CALL;
  276.             }
  277.             (void) strcat(desc, id_table[obj->which_kind].title);
  278.             (void) strcat(desc, item_name);
  279.             break;
  280.         case ARMOR:
  281.             if (obj->identified) {
  282.                 goto ID;
  283.             }
  284.             (void) strcpy(desc, id_table[obj->which_kind].title);
  285.             break;
  286.         case WEAPON:
  287.             if (obj->identified) {
  288.                 goto ID;
  289.             }
  290.             (void) strcat(desc, name_of(obj));
  291.             break;
  292.         }
  293.         break;
  294.     case CALLED:
  295. CALL:    switch(obj->what_is) {
  296.         case SCROLL:
  297.         case POTION:
  298.         case WAND:
  299.         case RING:
  300.             (void) strcat(desc, item_name);
  301.             (void) strcat(desc, "called ");
  302.             (void) strcat(desc, id_table[obj->which_kind].title);
  303.             break;
  304.         }
  305.         break;
  306.     case IDENTIFIED:
  307. ID:        switch(obj->what_is) {
  308.         case SCROLL:
  309.         case POTION:
  310.             (void) strcat(desc, item_name);
  311.             (void) strcat(desc, id_table[obj->which_kind].real);
  312.             break;
  313.         case RING:
  314.             if (wizard || obj->identified) {
  315.                 if ((obj->which_kind == DEXTERITY) ||
  316.                     (obj->which_kind == ADD_STRENGTH)) {
  317.                     sprintf(more_info, "%s%d ", ((obj->class > 0) ? "+" : ""),
  318.                         obj->class);
  319.                     (void) strcat(desc, more_info);
  320.                 }
  321.             }
  322.             (void) strcat(desc, item_name);
  323.             (void) strcat(desc, id_table[obj->which_kind].real);
  324.             break;
  325.         case WAND:
  326.             (void) strcat(desc, item_name);
  327.             (void) strcat(desc, id_table[obj->which_kind].real);
  328.             if (wizard || obj->identified) {
  329.                 sprintf(more_info, "[%d]", obj->class);
  330.                 (void) strcat(desc, more_info);
  331.             }
  332.             break;
  333.         case ARMOR:
  334.             sprintf(desc, "%s%d ", ((obj->d_enchant >= 0) ? "+" : ""),
  335.             obj->d_enchant);
  336.             (void) strcat(desc, id_table[obj->which_kind].title);
  337.             sprintf(more_info, "[%d] ", get_armor_class(obj));
  338.             (void) strcat(desc, more_info);
  339.             break;
  340.         case WEAPON:
  341.             sprintf(desc+strlen(desc), "%s%d,%s%d ",
  342.             ((obj->hit_enchant >= 0) ? "+" : ""),
  343.             obj->hit_enchant,
  344.             ((obj->d_enchant >= 0) ? "+" : ""),
  345.             obj->d_enchant);
  346.             (void) strcat(desc, name_of(obj));
  347.             break;
  348.         }
  349.         break;
  350.     }
  351. ANA:
  352.     if (!strncmp(desc, "a ", 2)) {
  353.         if (is_vowel(desc[2])) {
  354.             for (i = strlen(desc) + 1; i > 1; i--) {
  355.                 desc[i] = desc[i-1];
  356.             }
  357.             desc[1] = 'n';
  358.         }
  359.     }
  360.     if (obj->in_use_flags & BEING_WIELDED) {
  361.         (void) strcat(desc, "in hand");
  362.     } else if (obj->in_use_flags & BEING_WORN) {
  363.         (void) strcat(desc, "being worn");
  364.     } else if (obj->in_use_flags & ON_LEFT_HAND) {
  365.         (void) strcat(desc, "on left hand");
  366.     } else if (obj->in_use_flags & ON_RIGHT_HAND) {
  367.         (void) strcat(desc, "on right hand");
  368.     }
  369. }
  370.  
  371. get_wand_and_ring_materials()
  372. {
  373.     short i, j;
  374.     boolean used[WAND_MATERIALS];
  375.  
  376.     for (i = 0; i < WAND_MATERIALS; i++) {
  377.         used[i] = 0;
  378.     }
  379.     for (i = 0; i < WANDS; i++) {
  380.         do {
  381.             j = get_rand(0, WAND_MATERIALS-1);
  382.         } while (used[j]);
  383.         used[j] = 1;
  384.         id_wands[i].title=(char *)malloc(128);
  385.         (void) strcpy(id_wands[i].title, wand_materials[j]);
  386.         is_wood[i] = (j > MAX_METAL);
  387.     }
  388.     for (i = 0; i < GEMS; i++) {
  389.         used[i] = 0;
  390.     }
  391.     for (i = 0; i < RINGS; i++) {
  392.         do {
  393.             j = get_rand(0, GEMS-1);
  394.         } while (used[j]);
  395.         used[j] = 1;
  396.         id_rings[i].title=(char *)malloc(128);
  397.         (void) strcpy(id_rings[i].title, gems[j]);
  398.     }
  399. }
  400.  
  401. single_inv(ichar)
  402. short ichar;
  403. {
  404.     short ch;
  405.     char desc[DCOLS];
  406.     object *obj;
  407.  
  408.     ch = ichar ? ichar : pack_letter("inventory what?", ALL_OBJECTS);
  409.  
  410.     if (ch == CANCEL) {
  411.         return;
  412.     }
  413.     if (!(obj = get_letter_object(ch))) {
  414.         message("no such item.", 0);
  415.         return;
  416.     }
  417.     desc[0] = ch;
  418.     desc[1] = ((obj->what_is & ARMOR) && obj->is_protected) ? '}' : ')';
  419.     desc[2] = ' ';
  420.     desc[3] = 0;
  421.     get_desc(obj, desc+3);
  422.     message(desc, 0);
  423. }
  424.  
  425. struct id *
  426. get_id_table(obj)
  427. object *obj;
  428. {
  429.     switch(obj->what_is) {
  430.     case SCROLL:
  431.         return(id_scrolls);
  432.     case POTION:
  433.         return(id_potions);
  434.     case WAND:
  435.         return(id_wands);
  436.     case RING:
  437.         return(id_rings);
  438.     case WEAPON:
  439.         return(id_weapons);
  440.     case ARMOR:
  441.         return(id_armors);
  442.     }
  443.     return((struct id *) 0);
  444. }
  445.  
  446. inv_armor_weapon(is_weapon)
  447. boolean is_weapon;
  448. {
  449.     if (is_weapon) {
  450.         if (rogue.weapon) {
  451.             single_inv(rogue.weapon->ichar);
  452.         } else {
  453.             message("not wielding anything", 0);
  454.         }
  455.     } else {
  456.         if (rogue.armor) {
  457.             single_inv(rogue.armor->ichar);
  458.         } else {
  459.             message("not wearing anything", 0);
  460.         }
  461.     }
  462. }
  463.